﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="BitmapRegion.cs" company="melcoprog">
//   http://www.codeproject.com/Articles/6048/Creating-Bitmap-Regions-for-Forms-and-Buttons
// </copyright>
// <summary>
//   Defines the BitmapRegion type.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace ESheep
{
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;

    /// <summary>
    /// The bitmap region.
    /// </summary>
    public static class BitmapRegion
    {
        /// <summary>
        /// Calculate the graphics path that representing the figure in the bitmap 
        /// excluding the transparent color which is the top left pixel.
        /// </summary>
        /// <param name="bitmap">
        /// The bitmap.
        /// </param>
        /// <returns>
        /// The <see cref="GraphicsPath"/>.
        /// </returns>
        public static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
        {
            Graphics g = Graphics.FromImage(bitmap);

            // Create GraphicsPath for our bitmap calculation
            var graphicsPath = new GraphicsPath();

            // Use the top left pixel as our transparent color
            var colorTransparent = bitmap.GetPixel(0, 0);

            // This is to store the column value where an opaque pixel is first found.
            // This value will determine where we start scanning for trailing 
            // opaque pixels.

            int bytes = Math.Abs(bitmap.Width) * bitmap.Height;

            // Go through all rows (Y axis)
            for (var row = 0; row < bitmap.Height; row++)
            {
                // Reset value

                // Go through all columns (X axis)
                for (var col = 0; col < bitmap.Width; col++)
                {
                    // If this is an opaque pixel, mark it and search 
                    // for anymore trailing behind
                    if (bitmap.GetPixel(col, row) != colorTransparent)
                    {
                        // Opaque pixel found, mark current position
                        var colOpaquePixel = col;

                        // Create another variable to set the current pixel position
                        int colNext;

                        // Starting from current found opaque pixel, search for 
                        // anymore opaque pixels trailing behind, until a transparent
                        // pixel is found or minimum width is reached
                        for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                        {
                            if (bitmap.GetPixel(colNext, row) == colorTransparent)
                            {
                                break;
                            }
                        }

                        // Form a rectangle for line of opaque pixels found and 
                        // add it to our graphics path
                        graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));

                        // No need to scan the line of opaque pixels just found
                        col = colNext;
                    }
                }
            }

            // Return calculated graphics path
            return graphicsPath;
        }
    }
}
